2008年11月06日
川俣晶の縁側ソフトウェア技術雑記 total 3847 count

System.IO名前空間のメソッドでファイル一覧を得るときに列挙インターフェースが欲しい理由

Written By: 川俣 晶連絡先

 kkamegawaさんの.NET Framework 4.0のBCLより。

File System Enumerationは配列ベースの従来のSystem.IO.FileとかSystem.IO.DirectoryにIEnumerable<T>をつけてみようかって話。LINQと併用するとき便利なこともあるしねってことだそうで。

 これは重要です。その理由はファイルが1万個ぐらいあるフォルダに対して、GetFilesメソッドを使ってみると分かるのではないかな? 呼ぶとプログラムの実行がかなり長時間止まってしまいます。Win32 APIなら、「最初の1つくれ」「次くれ」「次くれ」……という流れなので、制御はすぐ戻ってきますが、GetFilesメソッドは全部揃うまで戻ってきません。

 この特徴はLINQとの相性が最悪です。たとえば、Anyメソッドのように全てのデータをチェックせずとも結果が確定するクエリは、確定した時点で動作を打ち切るわけですが、GetFilesメソッドは調べる必要のないファイル名までリストを作ってしまいます。

 ……ということが実は気になっていたので、列挙インターフェースが付くのは納得です。

 (デフォでRDBにデータを投げ込んで、生ファイルをあまり使わない人には分かりにくい話かもしれません)